#!/usr/bin/env bash
set -euo pipefail

# ESP-IDF 快捷脚本
# 提供以下命令：build / flash / monitor / all / list-ports / set-target
# 默认端口与波特率可通过环境变量覆盖：
#   PORT=/dev/cu.usbserial-310 BAUD=115200 ./idf_runner.sh flash

PROJECT_DIR="/Users/jieli/Desktop/Esp32Project/esp32-learn"
IDF_EXPORT="${HOME}/esp/esp-idf/export.sh"
DEFAULT_PORT="/dev/cu.usbserial-310"
DEFAULT_BAUD="115200"

usage() {
  cat << 'EOF'
用法：idf_runner.sh [build|flash|monitor|all|list-ports|set-target]

命令说明：
  build                         编译当前工程
  flash [-p PORT] [-b BAUD]    烧录到设备（默认端口/波特率）
  monitor [-p PORT] [-b BAUD]  打开串口监视器（按 Ctrl+] 退出）
  all [-p PORT] [-b BAUD]      依次执行 build + flash + monitor
  list-ports                    列出可用串口设备（macOS）
  set-target [esp32|esp32s3|...] 设置目标芯片（默认 esp32）

参数与环境变量：
  -p / --port   指定串口端口（默认：/dev/cu.usbserial-310）
  -b / --baud   指定波特率（默认：115200）
  也可用环境变量覆盖：PORT=/dev/cu.xxx BAUD=115200
EOF
}

ensure_idf_env() {
  if [ -f "$IDF_EXPORT" ]; then
    # shellcheck disable=SC1090
    . "$IDF_EXPORT"
  else
    echo "ERROR: 未找到 ESP-IDF export.sh: $IDF_EXPORT"
    exit 1
  fi
}

list_ports() {
  ls -1 /dev/cu.* 2>/dev/null || true
}

cmd="${1:-}"
shift || true

case "${cmd}" in
  build)
    ensure_idf_env
    cd "$PROJECT_DIR"
    idf.py build
    ;;
  flash)
    ensure_idf_env
    cd "$PROJECT_DIR"
    port="${PORT:-$DEFAULT_PORT}"
    baud="${BAUD:-$DEFAULT_BAUD}"
    while [ $# -gt 0 ]; do
      case "$1" in
        -p|--port) port="$2"; shift 2 ;;
        -b|--baud) baud="$2"; shift 2 ;;
        *) break ;;
      esac
    done
    idf.py -p "$port" -b "$baud" flash
    ;;
  monitor)
    ensure_idf_env
    cd "$PROJECT_DIR"
    port="${PORT:-$DEFAULT_PORT}"
    baud="${BAUD:-$DEFAULT_BAUD}"
    while [ $# -gt 0 ]; do
      case "$1" in
        -p|--port) port="$2"; shift 2 ;;
        -b|--baud) baud="$2"; shift 2 ;;
        *) break ;;
      esac
    done
    idf.py -p "$port" -b "$baud" monitor
    ;;
  all)
    ensure_idf_env
    cd "$PROJECT_DIR"
    port="${PORT:-$DEFAULT_PORT}"
    baud="${BAUD:-$DEFAULT_BAUD}"
    while [ $# -gt 0 ]; do
      case "$1" in
        -p|--port) port="$2"; shift 2 ;;
        -b|--baud) baud="$2"; shift 2 ;;
        *) break ;;
      esac
    done
    idf.py build
    idf.py -p "$port" -b "$baud" flash
    idf.py -p "$port" -b "$baud" monitor
    ;;
  list-ports)
    list_ports
    ;;
  set-target)
    ensure_idf_env
    cd "$PROJECT_DIR"
    target="${1:-esp32}"
    idf.py set-target "$target"
    ;;
  ""|-h|--help|help)
    usage
    ;;
  *)
    echo "未知命令: $cmd"
    usage
    exit 1
    ;;
esac